package br.com.sgi.util.email;

import java.io.IOException;
import java.net.UnknownHostException;
import java.security.Security;
import java.security.cert.Certificate;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class SendMail {

	private final String mailSMTPServer;
	private final String mailSMTPServerPort;

	private final String LOGIN = "sgiadm@gmail.com";
	private final String SENHA = "sistemasgi";

	/*
	 * quando instanciar um Objeto ja sera atribuido o servidor SMTP do GMAIL e
	 * a porta usada por ele
	 */
	public SendMail() { // Para o GMAIL
		mailSMTPServer = "gmail-smtp-msa.l.google.com";
		mailSMTPServerPort = "465";
	}

	/*
	 * caso queira mudar o servidor e a porta, so enviar para o contrutor os
	 * valor como string
	 */
	SendMail(String mailSMTPServer, String mailSMTPServerPort) { // Para outro
		// Servidor
		this.mailSMTPServer = mailSMTPServer;
		this.mailSMTPServerPort = mailSMTPServerPort;
	}

	
	 // Host do Gmail  
    private String SMTP_HOST_NAME;  
  
    // Login do usuário  
    private String SMTP_AUTH_USER;  
  
    // Senha do usuário  
    private String SMTP_AUTH_PWD;  
  
    // E-mail do remetente  
    private String emailFromAddress;  
  
    // Título do e-mail  
    private String emailSubjectTxt;  
  
    // Conteúdo do e-mail  
    private String emailMsgTxt;  
  
    // E-mails dos destinatários  
    private String emailList;
	
	
    
    public synchronized static void sendMail(String op) {  
        //Properties props = System.getProperties(); *** mesmo caso. ***  
        Properties props = new Properties();  
      
        
        
        
        if(op.equals("1")) {
        SSLSocketFactory factory = HttpsURLConnection
        .getDefaultSSLSocketFactory();
         
        SSLSocket socket = null;
        try {
			 socket = (SSLSocket) factory.createSocket("gmail-smtp.l.google.com", 465);
			socket.startHandshake();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         
        Certificate[] serverCerts = null;
		try {
			serverCerts = socket.getSession().getPeerCertificates();
		} catch (SSLPeerUnverifiedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println("Retreived Server's Certificate Chain");
         
        System.out.println(serverCerts.length + "Certifcates Found\n\n\n");
        for (int i = 0; i < serverCerts.length; i++) {
        Certificate myCert = serverCerts[i];
        System.out.println("====Certificate:" + (i+1) + "====");
        System.out.println("-Public Key-\n" + myCert.getPublicKey());
        System.out.println("-Certificate Type-\n " + myCert.getType());
         
        System.out.println();
        }
         
        try {
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        }
        else
        	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
        
        props.put("mail.smtp.host", "gmail-smtp.l.google.com");  
        props.put("mail.smtp.starttls.enable", "true");  
        props.put("mail.smtp.auth", "true");  
        props.put("mail.mime.charset", "ISO-8859-1");  
        props.put("mail.smtp.port", 465);  
        props.put("mail.smtp.socketFactory.port", 465);  
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.quitwait", "false");
        props.put("mail.debug", "true");
        
        System.out.println("compilado 1");
        try {  
          Session session = Session.getInstance(props, new Authenticator() {  
            @Override  
            protected PasswordAuthentication getPasswordAuthentication() {  
              return new PasswordAuthentication("sgiadm@gmail.com", "sistemasgi");  
            }  
          });  
            
          MimeMessage message = new MimeMessage(session);  
          message.setText("E-mail enviado com teste.");  
          message.setSubject("Teste de envio de e-mail");  
          message.setFrom(new InternetAddress("lucas.tdcosta@gmail.com"));  
          message.addRecipient(Message.RecipientType.TO, new InternetAddress("lucas.tdcosta@gmail.com"));  
          Transport.send(message);  
        } catch (MessagingException mex) {  
          mex.printStackTrace();  
        }  
      }  
    
	
	 public void sendEmail(String fromAddress, String toAddress, String subjectTxt, String messageTxt) throws Exception{  
	        emailFromAddress = LOGIN;  
	        emailList = "lucas.tdcosta@gmail.com";  
	        emailSubjectTxt = "teste";  
	        emailMsgTxt = "teste";  
	  
	        boolean debug = true;  
	        java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
	  
	        // Configurando o endereço SMTP do host   
	        Properties props = new Properties();  
	        props.put("mail.transport.protocol", "smtp");  
	        props.put("mail.smtp.starttls.enable", "true");  
	        props.put("mail.smtp.host", "gmail-smtp.l.google.com");  
	        props.put("mail.smtp.auth", "true");  
	        props.put("mail.smtp.port", mailSMTPServerPort); // porta
	        props.put("mail.debug", "true");
	  
	        // Caso o e-mail precise de autenticação  
	        Authenticator auth = new SimpleAuth(LOGIN, SENHA);  
	        
	        
	        Session session = Session.getInstance(props, new Authenticator() {
				@Override
				public PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(LOGIN, SENHA);
				}
			});
	        
//	        Session session = Session.getDefaultInstance(props, auth);  
	  
	        session.setDebug(debug);  
	  
	        // Criando a mensagem  
	        Message msg = new MimeMessage(session);  
	  
	        // Adicionando o e-mail do remetente  
	        InternetAddress addressFrom = new InternetAddress(emailFromAddress);  
	        msg.setFrom(addressFrom);  
	  
	        // Adicionando os e-mails dos destinatários  
	        InternetAddress[] addressTo = new InternetAddress[1];  
	        for (int i = 0; i < 1; i++) {  
	            addressTo[i] = new InternetAddress(emailList);  
	        }  
	        msg.setRecipients(Message.RecipientType.TO, addressTo);  
	  
	        // Adicionando o título do e-mail  
	        msg.setSubject(emailSubjectTxt);  
	          
	        // Adicionando o conteúdo do e-mail  
	        msg.setContent(emailMsgTxt, "text/plain");  
	        Transport.send(msg);  
	    }  
	 
	 private class SMTPAuthenticator extends javax.mail.Authenticator {  
		  
	        public PasswordAuthentication getPasswordAuthentication() {  
	            String username = LOGIN;  
	            String password = SENHA;  
	            return new PasswordAuthentication(username, password);  
	        }  
	    }  
	  

	public void sendMail(String from, String to, String subject, String message) {
		from = from == null ? LOGIN : from;
		Properties props = new Properties();

		/*
		 * quem estiver utilizando um SERVIDOR PROXY descomente essa parte e
		 * atribua as propriedades do SERVIDOR PROXY utilizado
		 * props.setProperty("proxySet","true");
		 * props.setProperty("socksProxyHost","proxybhz.cast.com.br"); // IP do
		 * Servidor Proxy props.setProperty("socksProxyPort","3128"); // Porta
		 * do servidor Proxy
		 */

		/*
		 * MailSSLSocketFactory socketFactory = null; try { socketFactory = new
		 * MailSSLSocketFactory(); } catch (GeneralSecurityException e1) { //
		 * TODO Auto-generated catch block e1.printStackTrace(); }
		 * socketFactory.setTrustAllHosts(true);
		 * props.put("mail.pop3s.ssl.socketFactory", socketFactory);
		 */

		
//		props.put("mail.transport.protocol", "smtp"); // define protocolo de
//		// envio como SMTP
		 props.put("mail.smtp.starttls.enable","true");
		props.put("mail.smtp.host", mailSMTPServer); // server SMTP do GMAIL
		props.put("mail.smtp.auth", "true"); // ativa autenticacao
		props.put("mail.smtp.user", from); // usuario ou seja, a conta que esta
//		// enviando o email (tem que ser do
//		// GMAIL)
		props.put("mail.debug", "true");
		props.put("mail.smtp.port", mailSMTPServerPort); // porta
		props.put("mail.smtp.socketFactory.port", mailSMTPServerPort); // mesma
//		// porta
//		// para
//		// o
//		// socket
		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.quitwait", "true");
		props.put(" mail.smtp.reportsuccess", "true");

		// Session - objeto que ira realizar a conexao com o servidor
		/*
		 * Como ha necessidade de autenticao criada uma autenticacao que
		 * responsavel por solicitar e retornar o usurio e senha para autenticao
		 */

		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			public PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(LOGIN, SENHA);
			}
		});
		session.setDebug(true);

		// Objeto que contem a mensagem
		Message msg = new MimeMessage(session);

		try {
			// Setando o destinat�rio
			msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
			// Setando a origem do email

			msg.setFrom(new InternetAddress(from));
			// Setando o assunto
			msg.setSubject(subject);
			// Setando o conteudo/corpo do email
			msg.setContent(message, "text/html");
			msg.setHeader("Return-Receipt-To", from);

		} catch (Exception e) {
			System.out.println(">> Erro: Completar Mensagem");
			e.printStackTrace();
		}
		try {
			Transport.send(msg);
		} catch (MessagingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

//		// Objeto encarregado de enviar os dados para o email
//		Transport tr;
//		try {
//			tr = session.getTransport("smtp"); // define smtp para transporte
//			/*
//			 * 1 - define o servidor smtp 2 - seu nome de usuario do gmail 3 -
//			 * sua senha do gmail
//			 */
//			tr.connect(mailSMTPServer, LOGIN, SENHA);
//			msg.saveChanges(); // don't forget this
//			// envio da mensagem
//			tr.sendMessage(msg, msg.getAllRecipients());
//			String needreply[] = msg.getHeader("Return-Receipt-To");
//			boolean replysign = false;
//			if (needreply != null) {
//				replysign = true;
//			}
//
//			tr.close();
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			System.out.println(">> Erro: Envio Mensagem");
//			e.printStackTrace();
//		}

	}

	// public void enviar() {
	// try {
	//
	// //usuario e senha do seu gmail
	// final String usuario = LOGIN;
	// final String senha = SENHA;
	//
	// //config. do gmail
	// Properties mailProps = new Properties();
	// mailProps.put("mail.transport.protocol", "smtp");
	// mailProps.put("mail.smtp.starttls.enable","true");
	// //mailProps.put("mail.smtp.host", "smtp.gmail.com");
	// gmail-smtp.l.google.com
	// mailProps.put("gmail-smtp.l.google.com", "smtp.gmail.com");
	// mailProps.put("mail.smtp.auth", "true");
	// mailProps.put("mail.smtp.user", usuario);
	// mailProps.put("mail.debug", "true");
	// mailProps.put("mail.smtp.port", "465");
	// mailProps.put("mail.smtp.socketFactory.port", "465");
	// mailProps.put("mail.smtp.socketFactory.class",
	// "javax.net.ssl.SSLSocketFactory");
	// mailProps.put("mail.smtp.socketFactory.fallback", "false");
	// mailProps.put ("mail.smtp.starttls.enable", "true");
	//
	// //eh necessario autenticar
	// Session mailSession = Session.getInstance(mailProps, new Authenticator()
	// {
	// public PasswordAuthentication getPasswordAuthentication(){
	// return new PasswordAuthentication(usuario, senha);
	// }
	// });
	// mailSession.setDebug(false);
	//
	// //config. da mensagem
	// Message mailMessage = new MimeMessage(mailSession);
	//
	// //remetente
	// mailMessage.setFrom(new InternetAddress(usuario));
	//
	// //destinatario
	// mailMessage.setRecipients(Message.RecipientType.TO,
	// InternetAddress.parse(usuario));
	//
	// //mensagem que vai no corpo do email
	// MimeBodyPart mbpMensagem = new MimeBodyPart();
	// mbpMensagem.setText("Segue em anexo, imagem do novo focus hath.");
	//
	// //partes do email
	// Multipart mp = new MimeMultipart();
	// mp.addBodyPart(mbpMensagem);
	//			
	// //imagem que sera enviada em anexo, ta no mesmo diretorio da classe.
	// String imagem = "focusHath2011.jpg";
	// InputStream is = getClass().getResourceAsStream(imagem);
	//
	// //setando o anexo
	// MimeBodyPart mbpAnexo = new MimeBodyPart();
	// //mbpAnexo.setDataHandler(new DataHandler(new ByteArrayDataSource(is,
	// "application/image")));
	// ///mbpAnexo.setFileName(imagem);
	// //mp.addBodyPart(mbpAnexo);
	//
	// //assunto do email
	// mailMessage.setSubject("Novo Focus Hath 2011");
	//			
	// //seleciona o conteudo
	// mailMessage.setContent(mp);
	//
	// //envia o email
	// Transport.send(mailMessage);
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// }
}

// clase que retorna uma autenticacao para ser enviada e verificada pelo
// servidor smtp
class SimpleAuth extends Authenticator {
	public String username = null;
	public String password = null;

	public SimpleAuth(String user, String pwd) {
		username = user;
		password = pwd;
	}

	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password);
	}
}
